/*
 *  Copyright 2016 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

import java.util.HashMap;
import java.util.Map;

// Java-side of androidmetrics.cc
//
// Rtc histograms can be queried through the API, getAndReset().
// The returned map holds the name of a histogram and its samples.
//
// Example of |map| with one histogram:
// |name|: "WebRTC.Video.InputFramesPerSecond"
//     |min|: 1
//     |max|: 100
//     |bucketCount|: 50
//     |samples|: [30]:1
//
// Most histograms are not updated frequently (e.g. most video metrics are an
// average over the call and recorded when a stream is removed).
// The metrics can for example be retrieved when a peer connection is closed.
@JNINamespace("webrtc::jni")
public class Metrics {
	private static final String TAG = "Metrics";

	public final Map<String, HistogramInfo> map =
			new HashMap<String, HistogramInfo>(); // <name, HistogramInfo>

	@CalledByNative
	Metrics() {}

	/**
	 * Class holding histogram information.
	 */
	public static class HistogramInfo {
		public final int min;
		public final int max;
		public final int bucketCount;
		public final Map<Integer, Integer> samples =
				new HashMap<Integer, Integer>(); // <value, # of events>

		@CalledByNative("HistogramInfo")
		public HistogramInfo(int min, int max, int bucketCount) {
			this.min = min;
			this.max = max;
			this.bucketCount = bucketCount;
		}

		@CalledByNative("HistogramInfo")
		public void addSample(int value, int numEvents) {
			samples.put(value, numEvents);
		}
	}

	@CalledByNative
	private void add(String name, HistogramInfo info) {
		map.put(name, info);
	}

	// Enables gathering of metrics (which can be fetched with getAndReset()).
	// Must be called before PeerConnectionFactory is created.
	public static void enable() {
		nativeEnable();
	}

	// Gets and clears native histograms.
	public static Metrics getAndReset() {
		return nativeGetAndReset();
	}

	private static native void nativeEnable();
	private static native Metrics nativeGetAndReset();
}
